const express = require("express");
const Router = express.Router();

// 引入 操作mysql的公共函数
const excSql = require("../utils/excSql");

// 引入 上传文件的相关的模块 
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });


// 查询所有英雄 
Router.get("/", (req, res) => {
  // 获取token token 前端发送请求的时候 存在 请求头中 

  // console.log(req.headers.authorization);

  excSql("SELECT * FROM hero", (result) => {
    // 如果 result 返回的是空数组 合理 ok 
    res.send({ msg: "查询成功", data: result });
  })
});


// 查询单个英雄
// 合法性校验
// 1 可能对id做判断  id 是不是数字类型  判断是不是数字类型 。。  string 。。
// 2 假设 根据id找不到那个数据 需要返回些什么给前端 
// 2.1 404 状态 
// 2.2 提示信息即可 
Router.get("/:id", (req, res) => {
  // 获取 参数id  query 
  const { id } = req.params;
  const sql = `SELECT * FROM hero WHERE id = ${id} `;
  excSql(sql, result => {
    // 明白 成功的查询的话 result 中只有一个元素！！ 

    // 判断一下能否找到数据
    if (result.length) {
      res.send({ msg: "查询成功", data: result[0] });
    } else {
      // 找不到对应的数据   id参数不对导致 
      res.status(404);
      res.send({ msg: "请检查参数id是否正确" });
    }


  });
});

// 新增一个英雄
// 合法性校验
// 也会判断接收到的参数 是不是 完整 
// 1 获取到参数 根据 是不是要必填项 来验证 不是必填项目 可以不用管它 一般 给默认值 
//  name 必填  gender  img 选填 
// 根据真实的业务来说，一般请求下，不允许 用户名相同！！ 名称相同 
Router.post("/", (req, res) => {
  // insert into hero set name = '小乔' , gender = '女', img ='12344' 
  // 获取post请求中的参数
  const { name, gender = "", img = "" } = req.body; // 必须使用一个中间件的帮助

  // 判断name 是否存在
  if (!name) {
    // 不存在
    // 状态码
    res.status(422);// 想要创建一个对象的时候 ， 参数校验不通过
    res.send({ msg: "请检查name参数是否正确！！" });
    return;
  };

  // 判断一下 当前的name 是否在数据库中已经存在  返回提示 即可 
  // select * from hero where name = name   

  const querySql = `select * from hero where name = '${name}'`;
  excSql(querySql, result => {
    if (result.length) {
      // 数据库中已经存在相同的name！
      res.send({ msg: "数据库中已经存在相同的name，请修改后重试" })
    } else {
      // 正常添加
      const sql = `INSERT INTO hero SET name = '${name}' , gender = '${gender}', img ='${img}' `;
      excSql(sql, result2 => {
        res.status(201);
        res.send({ msg: "添加成功" });
      });
    }
  })



});

// 删除一个英雄

// 先查询一下 这条数据是否存在 不存在 返回 404 提示 数据没有。。。
// 存在了 再去执行 删除操作 

Router.delete("/:id", (req, res) => {
  // delete from hero  where id =  1 
  const { id } = req.params;

  // 查询数据是否存在
  const querySql = `select * from hero where id = ${id}`;
  excSql(querySql, result => {
    // 是否存在
    if (result.length) {
      // 存在 正常执行删除操作
      const sql = `DELETE FROM hero  WHERE id =  ${id} `;
      excSql(sql, result2 => {
        res.status(204);// 删除成功
        res.send(''); // 返回了内容 也是没有用。。
      });
    } else {
      // 404 
      res.status(404);
      res.send({ msg: "您要删除的数据不存在，请检查id后重试" });
    }
  });




});

// 更新一个英雄
/* 
合法性处理
1 先确保id 数据存在 
2 接收到哪个参数，就修改哪个参数 
3 执行修改之前 需要挨个判断 参数是否存在
  如果 名称存在  name = '${name}' ,
  如果 性别存在  gender = '${gender}'
  如果 图片存在  img ='${img}


 */
Router.put("/:id", (req, res) => {
  // update hero set name = '小乔' , gender = '女', img ='12344'  where id = id 
  const { id } = req.params;
  // const { name, gender, img } = req.body;

  const querySql = `select * from hero where id = ${id}`;
  excSql(querySql, result => {
    if (result.length) {
      // 存在

      /* ===================== */

      if (Object.keys(req.body).length) {
        // 有传递过参数
        let sql = ` UPDATE hero SET `;
        for (const key in req.body) {
          const tempSql = ` ${key} = '${req.body[key]}' , `;
          sql += tempSql;
        }
        sql += `WHERE id = ${10}`;
        const arr = sql.split("");
        const index = arr.lastIndexOf(",");
        arr.splice(index, 1);
        sql = arr.join("");// 处理后的sql ！！ 
        excSql(sql, result2 => {
          res.status(201);
          res.send({ msg: "更新成功" });
        })
      } else {
        // console.log("您还没有传递要修改的参数");
        res.send({ msg: "您还没有传递要修改的参数" });
      }

      /* ===================== */

    } else {
      res.status(404);
      res.send({ msg: "您要更新的数据不存在，请检查id后重试" });
    }
  })

  // const sql = ` UPDATE hero SET  name = '${name}' , gender = '${gender}', img ='${img}'  WHERE id = ${id} `;

});


// 上传头像
// formdata { avatar:文本本身 }
// 借助第三方的模块 。。。multer 
// 返回值 有 当前上传完毕后的图片的 在线地址！！ 
Router.post("/avatar", upload.single('avatar'), (req, res) => {
  // 必须要返回 上传后的图片的路径 ！！ 

  // 获取到上传成功后的图片的路径 ？？？ 
  console.log(req.file);
  // http://localhost:3005/07c2b91537f0a112c88b4cfefc20a5b4 
  const src = `http://localhost:3005/${req.file.filename}`;
  res.send({ msg: "上传成功", src }); // 静态托管 是后台程序员 自己对外暴露一个 目录 不会放关键数据 
});

module.exports = Router;